package com.cskaoyan._03innerclazz._04local._04notice;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 16:22
 **/
/*
在局部内部类的成员方法中，如果想要访问作用域内部的局部变量，那么该变量：
1.  要么直接就用final修饰，是一个局部常量。
2.  要么就是一个事实上的常量，即只能赋值一次，相当于用final修饰它。
在Java8之前版本的JDK中，如果不给能在局部内部类内部，访问的局部变量直接加上final修饰，
会编译报错。
原因?---->局部变量,和对象的生命周期冲突


局部内部类对象作为方法的返回值, 返回值类型必须是其父类型
 */
public class Demo {
    public static void main(String[] args) {
        Object o = Outer.outerStaticMethod();
        System.out.println(o);
    }
}

// 外部类
class Outer{
    public void outerMethod() {
        // 局部位置
        // 局部变量
        int a = 1;
        final int b = 2;
        // 局部内部类
        class Inner{
            // 局部内部类的成员方法
            void innerMethod() {
                // 访问同一作用域内的局部变量a
                System.out.println(a);
                // 但是不能够修改
                // Variable 'a' is accessed from within inner class, needs to be final or effectively final
                // a++;
                //System.out.println(b);
                //b = b + 1;
            }
        }
    }

    // 局部内部类对象作为方法的返回值, 返回值类型必须是其父类型
    // 原因就是作用域问题
    public static Object outerStaticMethod() {
        // 局部位置
        // 局部内部类
        class Inner{

        }
        // 创建局部内部类的对象
        Inner inner = new Inner();
        return inner;
    }
}